package org.yajul.micro;
import com.google.inject.Binding;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.name.Names;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.yajul.util.ReflectionUtil;
import java.util.Map;
/**
* A Guice-based micro container.
* <br>
* User: josh
* Date: Mar 5, 2008
* Time: 12:10:39 PM
*/
public class MicroContainer {
private final static Logger log = LoggerFactory.getLogger(MicroContainer.class);
private Injector injector;
public MicroContainer(Injector injector)
{
this.injector = injector;
}
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append(this.getClass().getSimpleName()).append("{");
Map<Key<?>,Binding<?>> bindings = injector.getBindings();
for (Map.Entry<Key<?>, Binding<?>> keyBindingEntry : bindings.entrySet())
{
sb.append("\n ").append(keyBindingEntry.getKey().toString()).append(" -> ")
.append(keyBindingEntry.getValue().toString());
}
sb.append("\n}");
return sb.toString();
}
/**
* Returns the key for a given name. If 'name' can be loaded with the class loader, the
* class is returned. If 'name' is not a class, then only 'name' is returned.
*
* @param name the name, might be a class
* @param classLoader the classloader to use
* @return the name or the loaded class
*/
public static Object processName(String name, ClassLoader classLoader) {
try {
String n = name.contains("/") ? ReflectionUtil.filenameToClassname(name) : name;
return classLoader.loadClass(n);
} catch (ClassNotFoundException e) {
if (log.isTraceEnabled())
log.trace(name + " is not a class, leaving it as a string");
return name;
}
}
public Injector getInjector() {
return injector;
}
public <T> T getComponent(Class<T> componentType) {
return getInjector().getInstance(componentType);
}
public <T> T getComponent(Class<T> componentType,String name) {
return getInjector().getInstance(Key.get(componentType,Names.named(name)));
}
}